麦田云盒 1S Pro 安装黑群晖
我之前一直在一台 N5105 的小主机上通过 PVE 来运行 Docker 和黑群晖,随着存储内容的增加,原本的单盘位显得捉襟见肘起来;在闲鱼闲逛之时,看到了一台叫做麦田云盒 1S Pro 的小主机,配置刚好满足了我的需求,遂入手之~
配置
这台机器入手时的配置如下:
- J4125
- 单条4G(D4 双内存插槽)
- 双2.5G网口
- 双3.5盘位
- 256G nvme thinkplus m2 SSD
- 板载 32G emmc
- 被动散热
- 后置 8025 3pin DC风扇,但风扇接口为 4pin,可以更换 4pin pwm 风扇
- DC 供电,60W 群联外置电源
软件方面,这台机器是由万由代工,内置了万由的 U-NAS OS,我对它不感兴趣,直接安装了黑群晖。
这台机器后置了一个 8025 3pin arctic 风扇,噪音十分巨大,我换了一个利民 TL-B8 8025 风扇上去;更换风扇时需要将机器整个后挡板拆下来,否则风扇排线无法穿过。
将黑群晖引导写入板载 EMMC
现在黑群晖安装已经非常简单,按照 https://rrorg.cn/archives/Use%20guide 的指引,可以几乎做到一键安装。
这台机器内置了 32G EMMC
,我们可以将 RR
的引导写入该存储设备中,免去了使用 U 盘作为引导设备占用一个 USB 接口的问题。
要将引导写入 EMMC 中,可以先使用 U 盘进入 Linux Live 系统,使用 dd
命令将 RR
引导的 IMG
文件写入 EMMC 设备。命令如下:
# 请自行替换命令中引导文件和 EMMC 设备对应的路径
dd if=/rr.img of=/dev/mmcblk0 bs=4M
写入完成后,重启设备并拔掉 Linux Live 的 U 盘,开机后按照上述链接中的指引进行安装即可。
风扇自动调速
BIOS 本身不支持调速,只有通过机器内置的 U-NAS 才能实现调速。针对这个限制,网上早有前辈给出了解决方案:可以通过 i2cset
命令来设置风扇转速,实现调速功能。
由于群晖系统被阉割过,无法直接安装 i2cset
等命令,因此需要先安装 entware
这个软件仓库。
在群晖上安装 entware
可以参考官方教程:https://github.com/Entware/Entware/wiki/Install-on-Synology-NAS
entware
安装完成之后,可以通过以下命令来安装调速用到的软件包:
# sensor 这个程序用来读取 CPU 温度
# i2c-tools 这个程序用来设置风扇转速
opkg install lm-sensors i2c-tools
安装完成之后,我们便可以实现根据实时温度对风扇进行调速了。完整的脚本附在正文最后,有需要的朋友可以参考,具体思路如下:
- 使用
smartctl
来读取两块硬盘的温度 - 求出两块硬盘温度中的最高温度
- 使用
sensors
得出 CPU 核心的温度 - 求出硬盘和 CPU 之间的最高温度
- 使用温度计算出风扇转速,范围为
0x00 ~ 0xFF
,即最大值 255- 实际上设置的是 PWM 占空比,而不是风扇转速
- 读取当前的风扇转速
- 对比本次计算出的风扇转速和实际风扇转速差异值
- 若差异值大于 10 时,调节风扇转速并写入缓存文件
- 这一步是为了避免温度的细小波动使得风扇频繁调整转速
- 在群晖的 WebUI 中添加以 root 身份运行的定时任务,每分钟执行一次
#!/bin/sh
# Hard disk temperature
disk_temp1=$(smartctl --all /dev/sda | grep Temperature_Celsius | awk '{print $10}')
disk_temp2=$(smartctl --all /dev/sdb | grep Temperature_Celsius | awk '{print $10}')
disk_temp1=${disk_temp1:-40}
disk_temp2=${disk_temp2:-40}
max_disk_temp=$(( disk_temp1 > disk_temp2 ? disk_temp1 : disk_temp2 ))
echo "Disk temperature: $max_disk_temp"
# CPU temperature
cpu_temp=$(sensors | grep 'Physical id 0' | awk '{printf "%d", $4}')
cpu_temp=${cpu_temp:-40}
echo "CPU temperature: $cpu_temp"
max_temp=$(( max_disk_temp > cpu_temp ? max_disk_temp : cpu_temp ))
echo "Max temperature: $max_temp"
get_fan_speed() {
local temp=$1
if (( temp < 40 )); then
echo 80
elif (( temp > 70 )); then
echo 255
else
# 线性插值
echo $(( (temp - 40) * (255 - 80) / (70 - 40) + 80 ))
fi
}
fan_speed=$(get_fan_speed $max_temp)
echo "Fan speed: $fan_speed"
last_fan_speed_hex=$(i2cget -y 0 0x54 0xf0)
last_fan_speed=$(( last_fan_speed_hex ))
echo "Last fan speed: $last_fan_speed"
# diff between last and current fan speed
diff=$(( fan_speed > last_fan_speed ? fan_speed - last_fan_speed : last_fan_speed - fan_speed ))
if (( diff < 10 )); then
echo "Diff is less than 10, do nothing"
else
echo "Set fan speed to $fan_speed"
i2cset -y 0 0x54 0xf0 $fan_speed
echo "$(date '+%F %T') Temp=$max_temp Fan=$fan_speed Diff=$diff" >> /var/log/fan_control.log
fi